<?php

class PageInfo {
	/**
	 * 当前分页数
	 * @var int
	 */
	var $page = 1;
	
	/**
	 * 每页记录数
	 * @var int
	 */
	var $page_size = 20;
	
	/**
	 * 总记录数
	 * @var int
	 */
	var $total = 0;
	
	/**
	 * 总分页数
	 * @var int
	 */
	var $page_count = 0;
	
	/**
	 * 当前分页的可用链接
	 * @var array
	 */
	var $page_links = array();
	
	/**
	 * 第一页链接
	 * @var string
	 */
	var $first_link = null;
	
	/**
	 * 上一页链接
	 * @var string
	 */
	var $pre_link = null;
	
	/**
	 * 下一页链接
	 * @var string
	 */
	var $next_link = null;
	
	/**
	 * 最后一页链接
	 * @var string
	 */
	var $last_link = null;
	
	/**
	 * 链接显示数量，比如值为2，当前页数为7时显示：首页 上一页 5 6 7 8 9 下一页  尾页
	 * @var int
	 */
	var $page_view = 2;
	
	/**
	 * 分页链接格式化方法名称，此方法第一个参数是$url:当前链接 第二个参数：$page，分页数，比如：
	 * function my_page_link($url, $page){
	 * 		return $url . '?page=' . $page;
	 * }
	 * 此方法不能放在类里面！
	 * @var string
	 */
	var $page_link_format_fun = 'default_paget_link_format';
	
	public function PageInfo($page_size = 20, $page_view = 2){
		if($this->page_size < 1){
			$this->page_size = 20;
		}
		$this->page_size = $page_size;
		$this->page_view = $page_view;
		
		//从Request中获取当前分页
		if(isset($_REQUEST['page'])){
			$this->page = intval($_REQUEST['page']);
			if($this->page <= 0){
				$this->page = 1;
			}
		}
	}
	
	/**
	 * 获取开始的记录
	 */
	public function get_start(){
		$start = ($this->page - 1) * $this->page_size;
		return $start;
	}
	
	/**
	 * 设置总记录数，并计算其它值
	 * @param int $total
	 */
	public function set_total($total = 0){
		if($total<0){
			$total = 0;
		}
		$this->total = $total;
		
		//计算总页数
		if($total<=0){
			$this->page_count = 1;
		}else{
			$this->page_count = intval(($total + $this->page_size - 1) / $this->page_size);
		}
		
		if($this->page > $this->page_count){
			$this->page = $this->page_count;
		}
		
		//第一页链接
		$this->first_link = $this->get_page_link(1);
		
		if($this->page > 1){
			//上一页链接
			$this->pre_link = $this->get_page_link($this->page - 1);
		}
		
		if($this->page < $this->page_count){
			//下一页链接
			$this->next_link = $this->get_page_link($this->page + 1);
		}
		
		//最后一页链接
		$this->last_link = $this->get_page_link($this->page_count);
		
		//计算开始页数
		$start_page = $this->page - $this->page_view;
		if($start_page < 1){
			$start_page = 1;
		}
		//计算结束页数
		$end_page = $start_page + 2 * $this->page_view;
		if($end_page > $this->page_count){
			$end_page = $this->page_count;
		}
		for(;$start_page<=$end_page;++$start_page){
			$this->page_links[$start_page] = $this->get_page_link($start_page);
		}
	}
	
	/**
	 * 生成指定页的链接
	 * @param int $page
	 */
	private function get_page_link($page){
		$url = REQUEST_URI;
		if (preg_match('/(\?|&)page=(\d)/i', $url)) {
			//直接带有分页参数的
			return preg_replace('/(\?|&)page=(\d)/i', '$1page=' . $page, $url);
		}elseif(preg_match('/\.php\?/i', $url)){
			//动态链接，不带分页参数的
			return $url .= '&page=' . $page;
		}elseif(preg_match('/\.html\?/i', $url)){
			//静态链接，一般以list_243543_1.html这种格式
			return call_user_func($this->page_link_format_fun, $url, $page);
		}else{
			//其它的，比如目录结构的，直接添加分页参数
			if (preg_match('/\?/', $url)){
				//已经带有问题
				return $url .= '&page=' . $page;
			}else{
				return $url .= '?page=' . $page;
			}
		}
	}
}

/**
 * 默认的分页链接格式化
 * @param $url
 * @param $page
 */
function default_paget_link_format($url, $page){
	return preg_replace('/_(\d+).html/i', '_' . $page . '.html', $url);
}

?>